import java.awt.Cursor;

import allocator.Aluno;
import allocator.Coordenador;
import allocator.Curso;
import allocator.DadosUsuario
import allocator.Disciplina;
import allocator.Grupo
import allocator.HoraAula
import allocator.Horario
import allocator.Professor;
import allocator.Semestre
import allocator.Usuario;
import allocator.UsuarioGrupo;

class BootStrap {

    def init = { servletContext ->
		
		def grupoUsuario = Grupo.findByAuthority('ROLE_USUARIO') ?: new Grupo(authority: 'ROLE_USUARIO').save(failOnError: true)
		def grupoAdmin = Grupo.findByAuthority('ROLE_ADMIN') ?: new Grupo(authority: 'ROLE_ADMIN').save(failOnError: true)
		def grupoProfessor = Grupo.findByAuthority('ROLE_PROFESSOR') ?: new Grupo(authority: 'ROLE_PROFESSOR').save(failOnError: true)
		def grupoCoordenador = Grupo.findByAuthority('ROLE_COORDENADOR') ?: new Grupo(authority: 'ROLE_COORDENADOR').save(failOnError: true)

		// Administrador
		def administrador = Usuario.findByUsername('admin') ?: new Usuario(username: 'admin',
				password: 'admin',
				enabled:  true,
				dados: new DadosUsuario(nome: "Administrador do Sistema",
										fone: "1234-4321",
										email: "admin@email.com")).save(failOnError: true)
		if (!administrador.authorities.contains(grupoAdmin)) {
			UsuarioGrupo.create(administrador, grupoAdmin)
		}

		// Coordenador
		def coordenador = Coordenador.findByUsername("hamurabi") ?: new Coordenador(username: 'hamurabi',
				password: 'hamu',
				enabled:  true,
				dados: new DadosUsuario(nome: "Hamurábi Medeiros",
				fone: "1234-4321",
				email: "hamurabimedeiros@gmail.com")).save(failOnError: true)
		if (!coordenador.authorities.contains(grupoCoordenador)) {
			UsuarioGrupo.create(coordenador, grupoCoordenador)
		}
				
		// Alunos
		def aluno1 = Aluno.findByNome("João Bruno") ?: new Aluno(nome: "João Bruno", matricula: 928103, ativo: true).save(failOnError: true)
		def aluno2 = Aluno.findByNome("Washington") ?: new Aluno(nome: "Washington", matricula: 121221, ativo: true).save(failOnError: true)
		def aluno3 = Aluno.findByNome("Henrique") ?: new Aluno(nome: "Henrique", matricula: 222222, ativo: true).save(failOnError: true)
		def aluno4 = Aluno.findByNome("Pablo") ?: new Aluno(nome: "Pablo", matricula: 333333, ativo: true).save(failOnError: true)
		def aluno5 = Aluno.findByNome("Henrique") ?: new Aluno(nome: "Henrique", matricula: 444444, ativo: true).save(failOnError: true)

		// Cursos
		def curso1 = Curso.findByNomeAndCoordenador("Sistemas de Informação", coordenador) ?: new Curso(nome: "Sistemas de Informação", coordenador: coordenador).save(failOnError: true)
		def curso2 = Curso.findByNomeAndCoordenador("Jogos Digitais", coordenador) ?: new Curso(nome: "Jogos Digitais", coordenador: coordenador).save(failOnError: true)

		// Professor 1
		def professor1 = Professor.findByUsername("bel") ?: new Professor(username: 'bel',
				password: 'bel',
				enabled:  true,
				dados: new DadosUsuario(nome: "Isabel Nunes",
				email: "belnunes@gmail.com",
				fone: "3333-3333")).save(failOnError: true)
		if (!professor1.authorities.contains(grupoProfessor)) {
			UsuarioGrupo.create(professor1, grupoProfessor)
		}

		// Professor 2
		def professor2 = Professor.findByUsername("nego") ?: new Professor(username: 'nego',
				password: 'nego123',
				enabled:  true,
				dados: new DadosUsuario(nome: "Adriano Nego",
				email: "Adriano@gmail.com",
				fone: "3333-4444")).save(failOnError: true)
		if (!professor2.authorities.contains(grupoProfessor)) {
			UsuarioGrupo.create(professor2, grupoProfessor)
		}
				
		// Professor 3
		def professor3 = Professor.findByUsername("catao") ?: new Professor(username: 'catao',
				password: 'bruno',
				enabled:  true,
				dados: new DadosUsuario(nome: "Bruno Catão",
				email: "brunoCatao@gmail.com",
				fone: "1111-4444")).save(failOnError: true)
		if (!professor3.authorities.contains(grupoProfessor)) {
			UsuarioGrupo.create(professor3, grupoProfessor)
		}
				
		// Horários
		if (!Horario.findByDescricao("Por 2 Créditos")) {
			
			def dias = ['Segunda', 'Terça', 'Quarta', 'Quinta', 'Sexta']
			def turnos = ['Manhã', 'Noite']
			def horasInic = ['08:00', '09:50', '18:30', '20:20']
			def horasTerm = ['09:40', '11:30', '20:10', '22:00']
						   
			(0..4).each { i ->
				(0..3).each { j ->
					def trn = j < 2 ? turnos[0] : turnos[1]
					def aula = new HoraAula(dia: dias[i], inicio: horasInic[j], termino: horasTerm[j], turno: trn, credito: 2)
					aula.save(failOnError: true)
				}
			}
			
			def aulas = HoraAula.findAllByCredito(2)
			def horario = new Horario(descricao: "Por 2 Créditos")
			
			horario.horasAula = aulas
			horario.save(failOnError:true)
		}
		
		def semestre1 = Semestre.findByNumero("2012.1") ?: new Semestre(numero: "2012.1", curso: Curso.findByNome("Sistemas de Informação"), horario: Horario.findByDescricao("Por 2 Créditos")).save(failOnError: true)

//		def disciplina1 = Disciplina.findByNome("Sistemas Inteligentes") ?: new Disciplina(nome: "Sistemas Inteligentes", credito: 2, carga: 40).save(failOnError: true)
//		def disciplina2 = Disciplina.findByNome("Marketing para Informática") ?: new Disciplina(nome: "Marketing para Informática", credito: 2, carga: 40).save(failOnError: true)
//		def disciplina3 = Disciplina.findByNome("Metodologia da Pesquisa Científica") ?: new Disciplina(nome: "Metodologia da Pesquisa Científica", credito: 2, carga: 40).save(failOnError: true)
//		def disciplina4 = Disciplina.findByNome("Controle e Avaliação de Sistemas de Informação") ?: new Disciplina(nome: "Controle e Avaliação de Sistemas de Informação", credito: 2, carga: 40).save(failOnError: true)
//		def disciplina5 = Disciplina.findByNome("Análise e Técnicas de Algoritmos") ?: new Disciplina(nome: "Análise e Técnicas de Algoritmos", credito: 2, carga: 40).save(failOnError: true)
//		def disciplina6 = Disciplina.findByNome("Lab. Sistemas de Informação") ?: new Disciplina(nome: "Lab. Sistemas de Informação", credito: 2, carga: 40).save(failOnError: true)
    }
    def destroy = {
    }
}
